/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dosideas.dao.impl;

import com.dosideas.dao.ProvinciaDao;
import com.dosideas.domain.Provincia;
import com.dosideas.exception.NombreInvalidoException;
import java.util.Collection;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

/**
 *
 * @author ldeseta
 */
@Repository
public class ProvinciaDaoImpl implements ProvinciaDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public Provincia buscarProvinciaPorId(long id) {
        Provincia provincia;
        try {
            provincia = (Provincia) sessionFactory.getCurrentSession().get(Provincia.class, id);
        } catch (Exception e) {
            provincia = null;
        }
        return provincia;
    }

    @Override
    public Collection<Provincia> buscarProvinciaConNombreExacto(String nombreExacto) throws NombreInvalidoException {
        if (nombreExacto == null || nombreExacto.length() < 3) {
            throw new NombreInvalidoException("el parametro es nulo");
        }
        DetachedCriteria criteria = DetachedCriteria.forClass(Provincia.class);
        criteria.add(Restrictions.eq("nombre", nombreExacto));
        return criteria.getExecutableCriteria(sessionFactory.getCurrentSession()).list();
    }

    @Override
    public void guardarProvincia(Provincia provincia) {
        sessionFactory.getCurrentSession().save(provincia);
    }

    @Override
    public Collection<Provincia> buscarProvinciaConNombreAproximado(String nombreBuscar) {

        DetachedCriteria criteria = DetachedCriteria.forClass(Provincia.class);
        criteria.add(Restrictions.sqlRestriction("upper(nombre) like '%"+nombreBuscar.toUpperCase()+"%'"));

        List<Provincia> lista = criteria.getExecutableCriteria(sessionFactory.getCurrentSession()).list();
        return lista;
    }

    @Override
    public Collection<Provincia> listarProvincias() {
        DetachedCriteria criteria = DetachedCriteria.forClass(Provincia.class);
        return criteria.getExecutableCriteria(sessionFactory.getCurrentSession()).list();
    }
}
